package com.atguigu.tingshu.album.service.impl;
import java.math.BigDecimal;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.google.common.collect.Maps;

import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.asn1.dvcs.DVCSObjectIdentifiers;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueService albumAttributeValueService;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Transactional   // 进行接口的事务控制
	@Override
	public void albumInfoService(AlbumInfoVo albumInfoVo) {

		// 保存专辑的基本数据
		Long userId = AuthContextHolder.getUserId();
		AlbumInfo albumInfo = new AlbumInfo();    // 创建AlbumInfo对象,封装要保存专辑的基本数据
		BeanUtils.copyProperties(albumInfoVo, albumInfo);

		albumInfo.setUserId(userId);  				// 当前登录用户的id

		/**
		 * 对专辑的进行审核
		 * 1.先进行机审  -------> 和第三方的内容审核服务进行对接[收费, 现在很多的第三方的内容审核服务不对个人开放], 最终返回审核结果: 1.通过 2.不通过 3.不确定
		 * 2.针对机审不确定的请求需要进行人工干预
		 */
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);

		// 付费专辑需要设置试听的声音的集数
		String payType = albumInfo.getPayType();
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)) {
			albumInfo.setSecondsForFree(5);
		}
		albumInfoMapper.insert(albumInfo);

		// 保存专辑的属性值数据
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			albumAttributeValue.setAlbumId(albumInfo.getId());
			albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
			albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());
			return albumAttributeValue;
		}).collect(Collectors.toList());
		albumAttributeValueService.saveBatch(albumAttributeValueList);

		// 初始化专辑统计信息数据
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);   // 播放量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);   // 订阅量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);	// 购买量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);	// 评论数

	}

	@Override
	public IPage<AlbumListVo> findUserAlbumPage(Integer pageNo, Integer pageSize, AlbumInfoQuery albumInfoQuery) {

		// 获取当前登录用户的id
		Long userId = AuthContextHolder.getUserId();
		albumInfoQuery.setUserId(userId);

		// 调用mapper接口中的自定义分页查询方法完成分页查询
		IPage<AlbumListVo> page = new Page<>(pageNo , pageSize) ;
		albumInfoMapper.findUserAlbumPage(page, albumInfoQuery);

		// 返回
		return page;
	}

	@Override
	public void removeAlbumInfo(Long id) {

		// 删除专辑的基本数据
		albumInfoMapper.deleteById(id);

		// 删除专辑的统计数据
		LambdaQueryWrapper<AlbumStat> albumStatLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumStatLambdaQueryWrapper.eq(AlbumStat::getAlbumId, id);
		albumStatMapper.delete(albumStatLambdaQueryWrapper);

		// 删除专辑的属性值数据
		LambdaQueryWrapper<AlbumAttributeValue> albumAttributeValueLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumAttributeValueLambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId, id);
		albumAttributeValueService.remove(albumAttributeValueLambdaQueryWrapper);
	}

	@Override
	public AlbumInfo getAlbumInfo(Long id) {

		// 根据专辑的id查询专辑数据
		AlbumInfo albumInfo = albumInfoMapper.selectById(id);

		if(albumInfo != null) {
			// 根据专辑的id查询专辑的属性值数据
			LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapper = new LambdaQueryWrapper<>();
			lambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId, id);
			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueService.list(lambdaQueryWrapper);
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
		}
		return albumInfo;
	}

	@Transactional
	@Override
	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {

		// 修改专辑的基本数据
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		BeanUtils.copyProperties(albumInfoVo , albumInfo);
		albumInfoMapper.updateById(albumInfo);

		// 修改专辑的属性值数据
		// 1. 先把之前属性值数据删除掉
		LambdaQueryWrapper<AlbumAttributeValue> albumAttributeValueLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumAttributeValueLambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId , albumId);
		albumAttributeValueService.remove(albumAttributeValueLambdaQueryWrapper);

		// 2.新增属性值数据
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			albumAttributeValue.setAlbumId(albumId);
			albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
			albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());
			return albumAttributeValue;
		}).collect(Collectors.toList());
		albumAttributeValueService.saveBatch(albumAttributeValueList);
	}

	public void saveAlbumStat(Long albumId , String statType) {
		AlbumStat albumStat = new AlbumStat() ;
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat) ;
	}
}
